package me.zhengjie.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.web3j.utils.Numeric;

import java.math.BigInteger;

/**
 * @Author xc_wang@probe-group.com
 * @Date 2021/12/1
 * @Description 格式转换工具
 */
@Slf4j
public class FormatUtils {

    /**
     * 对交易的data字段进行格式转换，不同的交易类型参数也不同
//     * @param input
     * @return
     */
//    public static String convertTxInput(final String to, final String input) {
//        try {
//            if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_REGISTER_PNS.addr().equals(to)) {
//                //RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                //return new String(((RlpString) values.getValues().get(0)).getBytes());
//                return decodeHexToString(input);
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_REGISTER_AUTHORIZE.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return ((RlpString) values.getValues().get(0)).asPositiveBigInteger().toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_REGISTER_LOSE.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(((RlpString) values.getValues().get(0)).asPositiveBigInteger().toString());
//                joiner.add(new String(((RlpString) values.getValues().get(1)).getBytes()));
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_CANCELLATION.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(new String(((RlpString) values.getValues().get(0)).getBytes()));
//                joiner.add(new String(((RlpString) values.getValues().get(1)).getBytes()));
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_VOTE.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return new String(((RlpString) values.getValues().get(0)).getBytes());
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_APPLY_DPOS_NODE.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(new String(((RlpString) values.getValues().get(0)).getBytes()));
//                joiner.add(new String(((RlpString) values.getValues().get(1)).getBytes()));
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_REDEMPTION.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return new String(((RlpString) values.getValues().get(0)).getBytes());
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_CANCELLATION_LOST_ACCOUNT.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return new String(((RlpString) values.getValues().get(0)).getBytes());
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_REVEAL_LOSS_REPORT.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(new String(((RlpString) values.getValues().get(0)).getBytes()));
//                joiner.add(new String(((RlpString) values.getValues().get(1)).getBytes()));
//                joiner.add(new String(((RlpString) values.getValues().get(2)).getBytes()));
//                joiner.add(((RlpString) values.getValues().get(3)).asPositiveBigInteger().toString());
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_TRANSFER_LOST_ACCOUNT_BALANCE.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return new String(((RlpString) values.getValues().get(0)).getBytes());
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_REMOVE_LOSS_REPORT.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return new String(((RlpString) values.getValues().get(0)).getBytes());
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_REJECT_LOSS_REPORT.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return new String(((RlpString) values.getValues().get(0)).getBytes());
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_MODIFY_PNS_OWNER.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(new String(((RlpString) values.getValues().get(0)).getBytes()));
//                joiner.add(new String(((RlpString) values.getValues().get(1)).getBytes()));
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_MODIFY_PNS_CONTENT.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(new String(((RlpString) values.getValues().get(0)).getBytes()));
//                joiner.add(((RlpString) values.getValues().get(1)).asPositiveBigInteger().toString());
//                joiner.add(new String(((RlpString) values.getValues().get(2)).getBytes()));
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_MODIFY_LOSS_TYPE.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                return ((RlpString) values.getValues().get(0)).asPositiveBigInteger().toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_TRANSFER_LOST_ACCOUNT_PNS.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(new String(((RlpString) values.getValues().get(0)).getBytes()));
//                joiner.add(new String(((RlpString) values.getValues().get(1)).getBytes()));
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_TRANSFER_LOST_ACCOUNT_AUTHORIZE.addr().equals(to)) {
//                RlpList values = (RlpList) RlpDecoder.decode(Numeric.hexStringToByteArray(input)).getValues().get(0);
//                StringJoiner joiner = new StringJoiner(",");
//                joiner.add(new String(((RlpString) values.getValues().get(0)).getBytes()));
//                joiner.add(new String(((RlpString) values.getValues().get(1)).getBytes()));
//                return joiner.toString();
//
//            } else if (SpecialAddressEnum.SPECIAL_ADDRESS_FOR_TRANSFER_LOST_ACCOUNT_ASSET.addr().equals(to)) {
//                return input;
//            } else {
//                if(StringUtils.isNotBlank(to)){
//                    return decodeHexToString(input);
//                }else{
//                    return null;
//                }
//            }
//        } catch (Exception e) {
//            log.error("input解析异常",e.getMessage());
//            return null;
//        }
//    }

    public static String decodeHexToNumber(String hexStr){
        if(StringUtils.isNotBlank(hexStr)){
            return Numeric.decodeQuantity(hexStr).toString();
        }
        return "0";
    }

    public static void main(String[] args) {
        decodeHexToNumber("0x0");
    }

    public static BigInteger decodeHexToBigInteger(String hexStr){
        if(StringUtils.isNotBlank(hexStr)){
            return Numeric.decodeQuantity(hexStr);
        }
        return BigInteger.ZERO;
    }

    public static Long decodeHexToLong(String hexStr){
        if(StringUtils.isNotBlank(hexStr)){
            return Numeric.decodeQuantity(hexStr).longValue();
        }
        return 0L;
    }

    public static Integer decodeHexToInteger(String hexStr){
        if(StringUtils.isNotBlank(hexStr)){
            return Numeric.decodeQuantity(hexStr).intValue();
        }
        return 0;
    }

    public static String decodeHexToString(String hexStr){
        if(StringUtils.isNotBlank(hexStr)){
            return new String(Numeric.hexStringToByteArray(hexStr));
        }
        return hexStr;
    }
//
//    public static Map<String, AbiMethod> parseContractMethod(String abi){
//        Map<String,AbiMethod> methodIdMap = new HashMap<>();
//        try {
//            List<AbiBody> methodList = JSONObject.parseArray(abi, AbiBody.class);
//            for(AbiBody body : methodList){
//                int inputSize = body.getInputs().size();
//                String parameters = "";
//                if(inputSize > 0){
//                    StringJoiner types = new StringJoiner(",");
//                    for (int i = 0; i < inputSize; i++) {
//                        types.add(body.getInputs().get(i).getType());
//                    }
//                    parameters = types.toString();
//                }
//                String sign = (StringUtils.isBlank(body.getName()) ? "" : body.getName())+"("+parameters+")";
//                byte[] hash = Hash.sha3(sign.getBytes(StandardCharsets.UTF_8));
//
//                AbiMethod method = new AbiMethod();
//                method.setId(Numeric.toHexString(Arrays.copyOf(hash,4)).toLowerCase());
//                method.setHash(Numeric.toHexString(hash).toLowerCase());
//                method.setName(sign);
//                method.setType(AbiTypeEnum.getCodeByDesc(body.getType()));
//
//                methodIdMap.put(method.getId(), method);
//            }
//        } catch (Exception e) {
//            log.error("解析合约参数异常", e);
//        }
//        return MapUtils.isEmpty(methodIdMap) ? null : methodIdMap;
//    }

    public static String parseContractMethodName(String methodName){
        if(StringUtils.isBlank(methodName)){
            return null;
        }
        int cutIndex = methodName.indexOf("(");
        if(cutIndex < 0){
            return methodName;
        }else{
            return methodName.substring(0,cutIndex);
        }
    }
}
